/**
 * 在定义函数或类是类型不明确时可以使用泛型
 * 
 * 泛型的工具类
 * 1、Partial 用来创建一个新的类型，将type的所有属性设置为可选项
 * 2、Readonly 用来创建一个新的类型，将type的所有属性设置为只读
 * 3、Pick 从Type中选择一组属性来构造新类型
 * 4、Record 构造一个新的类型，属性值为keys,类型为Type
 * 
 */

 function fn1<T>(a:T):T {
    return a;
}
// 不指定泛型
let res = fn1(10)
// 指定泛型
let res1 = fn1<string>("hello")

function fn4<T,K>(a:T,b:K):K {
    return b
}

fn4<number,string>(10,"sd")

interface Inter {
    length:number
}

function fn3<T extends Inter>(a:T):number {
    return a.length
}

let res3 = fn3([1,2,3,2])
console.log(res3);

interface Propo {
    id:number
    name:string
}

type Propo1 = Partial<Propo>
type Propo2 = Readonly<Propo>